/*************************************************
  * 描述：消息提示框
  *
  * File：cximessagebox.h
  * Author：dongyao@mozihealthcare.cn
  * Date：2025/9/24
  * Update：
  * ************************************************/

#ifndef CXIMESSAGEBOX_H
#define CXIMESSAGEBOX_H

#include <QDialog>
#include <controls/export.h>
class CxiMessageBoxPrivate;

QT_BEGIN_NAMESPACE
namespace Ui
{
	class CxiMessageBox;
}
QT_END_NAMESPACE

class CXI_CONTROLS_EXPORT CxiMessageBox : public QDialog
{
	Q_OBJECT
public:
	/**
	 * 枚举-图标
	 */
	enum Icon
	{
		NoIcon = 0,
		Information = 1,// 信息
		Question = 2,   // 疑问
		Success = 3,    // 成功
		Warning = 4,    // 警告
		Critical = 5    // 错误
	};
	/**
	 * 枚举-标准按钮
	 */
	enum StandardButton
	{
		NoButton = 0x00000000,
		Ok = 0x00000400,
		Save = 0x00000800,
		SaveAll = 0x00001000,
		Open = 0x00002000,
		Yes = 0x00004000,
		YesToAll = 0x00008000,
		No = 0x00010000,
		NoToAll = 0x00020000,
		Abort = 0x00040000,
		Retry = 0x00080000,
		Ignore = 0x00100000,
		Close = 0x00200000,
		Cancel = 0x00400000,
		Discard = 0x00800000,
		Help = 0x01000000,
		Apply = 0x02000000,
		Reset = 0x04000000,
		RestoreDefaults = 0x08000000
	};
	Q_DECLARE_FLAGS(StandardButtons, StandardButton)
	Q_FLAG(StandardButtons)

	/**
	 * 构造函数
	 * @param parent 父窗体
	 **/
	explicit CxiMessageBox(QWidget* parent = nullptr);
	/**
	 * 构造函数
	 * @param icon 图标
	 * @param title 标题
	 * @param text 提示内容
	 * @param buttons 按钮组
	 * @param parent 父窗体
	 * @param flags 窗体属性
	 * @param showAsIPTitle 是否显示IP
	 * @param modal 是否模态
	 */
	CxiMessageBox(Icon icon, const QString& title, const QString& text,
				  StandardButtons buttons = CxiMessageBox::NoButton,
				  QWidget* parent = nullptr,
				  Qt::WindowFlags flags = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint,
				  bool showAsIPTitle = true,
				  bool modal = true);
	~CxiMessageBox() override;
	/**
	 * 静态方法-模态消息提示框-information
	 * @param parent 父窗体
	 * @param title 标题
	 * @param text 文本内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 * @return
	 */
	static StandardButton information(QWidget* parent, const QString& title, const QString& text, StandardButtons buttons = StandardButton::Ok, bool showAsIPTitle = true);

	/**
	 * 静态方法-模态消息提示框-question
	 * @param parent 父窗体
	 * @param title 标题
	 * @param text 文本内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 * @return
	 */
	static StandardButton question(QWidget* parent, const QString& title, const QString& text, StandardButtons buttons = StandardButtons(Yes | No), bool showAsIPTitle = true);

	/**
	 * 静态方法-模态消息提示框-success
	 * @param parent 父窗体
	 * @param title 标题
	 * @param text 文本内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 * @return
	 */
	static StandardButton success(QWidget* parent, const QString& title, const QString& text,
								  StandardButtons buttons = StandardButton::Ok,
								  bool showAsIPTitle = true);

	/**
	 * 静态方法-模态消息提示框-warning
	 * @param parent 父窗体
	 * @param title 标题
	 * @param text 文本内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 * @return
	 */
	static StandardButton warning(QWidget* parent, const QString& title, const QString& text,
								  StandardButtons buttons = (StandardButton::Ok),
								  bool showAsIPTitle = true);

	/**
	 * 静态方法-模态消息提示框-critical
	 * @param parent 父窗体
	 * @param title 标题
	 * @param text 文本内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 */
	static StandardButton critical(QWidget* parent, const QString& title, const QString& text,
								   StandardButtons buttons = (StandardButton::Ok),
								   bool showAsIPTitle = true);
	/**
	 * 静态方法-显示消息提示框
	 * @param parent 父窗体
	 * @param icon 图标
	 * @param title 标题
	 * @param text 提示内容
	 * @param buttons 按钮组
	 * @param showAsIPTitle 是否显示IP
	 * @return	点击按钮
	 */
	static CxiMessageBox::StandardButton showMessageBox(QWidget* parent, CxiMessageBox::Icon icon, const QString& title, const QString& text, CxiMessageBox::StandardButtons buttons, bool showAsIPTitle);

	// 获取按钮点击值
	StandardButton clickedButton();

	// 设置是否以 IP 样式显示标题
	void setShowAsIPTitle(bool showAsIPTitle);
	bool showAsIPTitle();

	// 设置文本
	void setText(const QString& text);
	QString text();

	// 添加按钮
	void addButton(StandardButton button);

	// 设置提示图标
	void setIcon(Icon icon);

protected:
	void showEvent(QShowEvent* event) override;

private:
	Q_DECLARE_PRIVATE(CxiMessageBox)
	QScopedPointer<CxiMessageBoxPrivate> d_ptr;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(CxiMessageBox::StandardButtons)

#endif//CXIMESSAGEBOX_H
